package condominio.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import condominio.modelo.Residente;
import condominio.excepcion.DAOExcepcion;
import condominio.util.ConexionBD;

public class ResidenteDAO extends BaseDAO {

	public Collection<Residente> buscarPorNombre(String nombre)	throws DAOExcepcion {
		String query = "select CodigoResidente,TipoDocumento,DocumentoIdentidad,Correo,Password,Nombre,ApellidoPaterno,ApellidoMaterno,NombreCompleto,FechaNacimiento,Estado from residente where estado = 1 and NombreCompleto like ?";
		Collection<Residente> lista = new ArrayList<Residente>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombre + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Residente vo = new Residente();
				vo.setCodigoresidente(rs.getString("CodigoResidente"));
				vo.setApellidoMaterno(rs.getString("ApellidoMaterno"));
				vo.setApellidoPaterno(rs.getString("ApellidoPaterno"));
				vo.setCorreo(rs.getString("Correo"));
				vo.setDocumentoidentidad(rs.getString("DocumentoIdentidad"));
				vo.setTipodocumento(rs.getByte("TipoDocumento"));
				vo.setNombre(rs.getString("Nombre"));
				vo.setNombrecompleto(rs.getString("NombreCompleto"));
				vo.setPassword(rs.getString("Password"));
				vo.setFechaNacimiento(rs.getDate("FechaNacimiento"));
				vo.setEstado(rs.getBoolean("Estado"));
				lista.add(vo);
			}
			return lista;
		}catch (SQLException e) {
			System.out.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		}finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}		
	}
	
	public Collection<Residente> buscarPorDocumento(byte tipodocumento,
													String documentoidentidad)	throws DAOExcepcion {
		String query = "select CodigoResidente,TipoDocumento,DocumentoIdentidad,Correo,Password,Nombre,ApellidoPaterno,ApellidoMaterno,NombreCompleto,FechaNacimiento,Estado from residente where estado = 1 and tipodocumento = ? and documentoidentidad = ?";
		Collection<Residente> lista = new ArrayList<Residente>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setByte(1, tipodocumento);
			stmt.setString(2, documentoidentidad);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Residente vo = new Residente();
				vo.setCodigoresidente(rs.getString("CodigoResidente"));
				vo.setApellidoMaterno(rs.getString("ApellidoMaterno"));
				vo.setApellidoPaterno(rs.getString("ApellidoPaterno"));
				vo.setCorreo(rs.getString("Correo"));
				vo.setDocumentoidentidad(rs.getString("DocumentoIdentidad"));
				vo.setTipodocumento(rs.getByte("TipoDocumento"));
				vo.setNombre(rs.getString("Nombre"));
				vo.setNombrecompleto(rs.getString("NombreCompleto"));
				vo.setPassword(rs.getString("Password"));
				vo.setFechaNacimiento(rs.getDate("FechaNacimiento"));
				vo.setEstado(rs.getBoolean("Estado"));
				lista.add(vo);
			}
			return lista;
		}catch (SQLException e) {
			throw new DAOExcepcion(e.getMessage());
		}finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}		
	}

	public void insertar(Residente vo) throws DAOExcepcion {
		String query = "INSERT INTO residente (CodigoResidente,TipoDocumento,DocumentoIdentidad,Correo,Password,Nombre,ApellidoPaterno,ApellidoMaterno,NombreCompleto,FechaNacimiento) values (?,?,?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getCodigoresidente());
			stmt.setByte(2, vo.getTipodocumento());
			stmt.setString(3, vo.getDocumentoidentidad());
			stmt.setString(4, vo.getCorreo());
			stmt.setString(5, vo.getPassword());
			stmt.setString(6, vo.getNombre());
			stmt.setString(7, vo.getApellidoMaterno());
			stmt.setString(8, vo.getApellidoPaterno());
			stmt.setString(9, vo.getNombrecompleto());
			stmt.setDate(10, vo.getFechaNacimiento()); 
									
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}	

		} catch (SQLException e) {
			//System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		//return vo;
	}
	
	public Residente obtener(String codigoresidente) throws DAOExcepcion {
		Residente vo = new Residente();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select Correo,Password,CodigoResidente,TipoDocumento,DocumentoIdentidad,Nombre,ApellidoPaterno,ApellidoMaterno,FechaNacimiento,Estado from residente where CodigoResidente=? and estado = 1";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, codigoresidente);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setCodigoresidente(rs.getString("CodigoResidente"));
				vo.setApellidoMaterno(rs.getString("ApellidoMaterno"));
				vo.setApellidoPaterno(rs.getString("ApellidoPaterno"));
				vo.setCorreo(rs.getString("Correo"));
				vo.setDocumentoidentidad(rs.getString("DocumentoIdentidad"));
				vo.setTipodocumento(rs.getByte("TipoDocumento"));
				vo.setNombre(rs.getString("Nombre"));
				vo.setPassword(rs.getString("Password"));
				vo.setFechaNacimiento(rs.getDate("FechaNacimiento"));
				vo.setEstado(rs.getBoolean("Estado"));
			}
		} catch (SQLException e) {
			//System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	public void eliminar(String dni) throws DAOExcepcion {
		String query = "update residente set estado = 0 WHERE CodigoResidente=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, dni);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			//System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void actualizar(Residente vo) throws DAOExcepcion {
		String query = "update residente set Nombre=?,ApellidoPaterno=?,ApellidoMaterno=?,Correo=?,FechaNacimiento=?,Password=?,NombreCompleto=? where CodigoResidente=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getNombre());
			stmt.setString(2, vo.getApellidoPaterno());
			stmt.setString(3, vo.getApellidoMaterno());
			stmt.setString(4, vo.getCorreo());
			stmt.setDate(5, vo.getFechaNacimiento());
			stmt.setString(6, vo.getPassword());
			stmt.setString(7, vo.getNombrecompleto());
			stmt.setString(8, vo.getCodigoresidente());			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			//System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public Collection<Residente> listar() throws DAOExcepcion {
		Collection<Residente> c = new ArrayList<Residente>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select Correo,Password,CodigoResidente,TipoDocumento,DocumentoIdentidad,Nombre,ApellidoPaterno,ApellidoMaterno,FechaNacimiento,Estado from residente where estado = 1 order by ApellidoPaterno";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Residente vo = new Residente();
				vo.setCodigoresidente(rs.getString("CodigoResidente"));
				vo.setApellidoMaterno(rs.getString("ApellidoMaterno"));
				vo.setApellidoPaterno(rs.getString("ApellidoPaterno"));
				vo.setCorreo(rs.getString("Correo"));
				vo.setDocumentoidentidad(rs.getString("DocumentoIdentidad"));
				vo.setTipodocumento(rs.getByte("TipoDocumento"));
				vo.setNombre(rs.getString("Nombre"));
				vo.setPassword(rs.getString("Password"));
				vo.setFechaNacimiento(rs.getDate("FechaNacimiento"));
				vo.setEstado(rs.getBoolean("Estado"));
				c.add(vo);
			}

		} catch (SQLException e) {
			//System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

}
